/*
 * @Author: qiulin 1746365080@qq.com
 * @Date: 2024-11-01 16:49:19
 * @LastEditors: qiulin_JXGM ql1746365080@gmail.com
 * @LastEditTime: 2024-12-06 16:50:07
 * @FilePath: /SGSim/DataStructure/Input/PARAMETER/NLPARMData.h
 */
#pragma once
#include <math.h>

#include <set>

#include "DataStructure/Common/Constant.h"
#include "DataStructure/Common/DataStructureNamespace.h"
#include "DataStructure/Common/Real.h"
#include "DataStructure/Common/SGObject.h"

SG_DATASTRUCTURE_FEM_NAMESPACE_OPEN
///< @brief 为非线性静态分析迭代策略定义了一组参数
struct DECLSPEC NLPARMData : public SGObject
{
    SG::DataStructure::Common::I64  m_NINC     = 0;    ///< 增量数量
    SG::DataStructure::Common::Real m_DT       = 0.0;  ///< 蠕变分析的增量时间间隔
    SG::DataStructure::Common::I64  m_KMETHOD  = 0;    ///< 控制刚度更新的方法
    SG::DataStructure::Common::I64  m_KSTEP    = 0;    ///< 在ITER方法中，刚度更新之前的迭代次数，FNT和PFNT中还不一样
    SG::DataStructure::Common::I64  m_MAXITER  = 25;   ///< 每个加载增量的迭代次数限制
    SG::DataStructure::Common::I64  m_CONV     = 0;    ///< 选择收敛标准的标志
    SG::DataStructure::Common::I64  m_INTOUT   = 0.0;  ///< 中间输出标志
    SG::DataStructure::Common::Real m_EPSU     = 0.001;   ///< 位移（U）标准的误差容忍度,(H5是0.001，文档是0.01)
    SG::DataStructure::Common::Real m_EPSP     = 0.001;   ///< 载荷（P）标准的误差容忍度(H5是0.001，文档是0.01)
    SG::DataStructure::Common::Real m_EPSW     = 1.0E-7;  ///< 功（W）标准的误差容忍度(H5是1.0E-7，文档是0.01)
    SG::DataStructure::Common::I64  m_MAXDIV   = 3;       ///< 每次迭代的可能发散条件限制
    SG::DataStructure::Common::I64  m_MAXQN    = 25;      ///< 可保存到数据库中的准牛顿修正向量的最大数量
    SG::DataStructure::Common::I64  m_MAXLS    = 4;       ///< 每次迭代允许的最大线搜索次数。
    SG::DataStructure::Common::Real m_FSTRESS  = 0.2;     ///< 用于限制材料例程中子增量大小的有效应力的分数
    SG::DataStructure::Common::Real m_LSTOL    = 0.5;     ///< 线搜索容差
    SG::DataStructure::Common::I64  m_MAXBIS   = 5;       ///< 每个加载增量允许的最大二分次数
    SG::DataStructure::Common::Real m_MAXR     = 20.0;    ///< 调整后的弧长增量与初始值的最大比率。
    SG::DataStructure::Common::Real m_RTOLB    = 20;  ///< 每次迭代允许的最大增量旋转（以度为单位），以激活二分法
    SG::DataStructure::Common::I64  m_MINITER  = 0;   ///< 每个增量的最小迭代次数，仅适用于具有接触的SOL 101和SOL 400
    SG::DataStructure::Common::Id   m_domainId = 0;   ///<
};

///< @brief 重载==
DECLSPEC bool operator== (const NLPARMData& val1, const NLPARMData& val2);

SG_DATASTRUCTURE_FEM_NAMESPACE_CLOSE